package com.satan.juc.demo24;

import java.util.concurrent.atomic.AtomicReference;

public class AtomicReferenceExample {
    public static void main(String[] args) {
        AtomicReference<Integer> atomicReference = new AtomicReference<>(0);

        // 使用set方法设置AtomicReference的值为10
        atomicReference.set(10);

        // 使用get方法获取AtomicReference的当前值
        Integer value = atomicReference.get();

        // 使用getAndSet方法设置AtomicReference的值为20，并获取其原始值
        Integer oldValue = atomicReference.getAndSet(20);

        // 使用compareAndExchange方法设置AtomicReference的值为30，并获取其原始值
        Integer oldValue2 = atomicReference.compareAndExchange(10, 30);

        // 使用compareAndExchangeAcquire方法设置AtomicReference的值为40，并获取其原始值
        Integer oldValue3 = atomicReference.compareAndExchangeAcquire(10, 40);

        // 使用compareAndExchangeRelease方法设置AtomicReference的值为50，并获取其原始值
        Integer oldValue4 = atomicReference.compareAndExchangeRelease(10, 50);

        // 使用compareAndSet方法设置AtomicReference的值为60，并获取其原始值
        boolean b = atomicReference.compareAndSet(10, 60);

        // 使用getAcquire方法获取AtomicReference的当前值，并在获取时等待，直到有一个线程成功获取锁
        Integer value2 = atomicReference.getAcquire();

        // 使用getOpaque方法获取AtomicReference的当前值，但不等待锁
        Integer value4 = atomicReference.getOpaque();

        // 使用getPlain方法获取AtomicReference的当前值，但不等待锁，并返回null
        Integer value5 = atomicReference.getPlain();

        // 使用weakCompareAndSet方法设置AtomicReference的值为70，并获取其原始值
        boolean b1 = atomicReference.weakCompareAndSet(10, 70);

        // 使用weakCompareAndSetPlain方法设置AtomicReference的值为80，并获取其原始值
        boolean b2 = atomicReference.weakCompareAndSetPlain(10, 80);

        // 使用weakCompareAndSetVolatile方法设置AtomicReference的值为90，并获取其原始值
        boolean b3 = atomicReference.weakCompareAndSetVolatile(10, 90);

        // 使用weakCompareAndSetAcquire方法设置AtomicReference的值为100，并获取其原始值
        boolean b4 = atomicReference.weakCompareAndSetAcquire(10, 100);

        // 使用weakCompareAndSetRelease方法设置AtomicReference的值为110，并获取其原始值
        boolean b5 = atomicReference.weakCompareAndSetRelease(10, 110);
    }
}
